#include <stdio.h>  
#include <stdlib.h>  
  
/* 定义单链表节点结构体 */  
typedef struct Node {  
    int coef;  // 系数  
    int expn;  // 指数  
    struct Node *next;  
} Node;  
  
/* 创建新节点 */  
Node *createNode(int coef, int expn) {  
    Node *newNode = (Node *)malloc(sizeof(Node));  
    newNode->coef = coef;  
    newNode->expn = expn;  
    newNode->next = NULL;  
    return newNode;  
}  
  
/* 将一元多项式乘法转换为单链表相乘 */  
Node *multiply(Node *poly1, Node *poly2) {  
    Node *result = NULL;  // 存储结果的链表  
    Node *p1 = poly1, *p2 = poly2;  // 指向两个多项式的节点  
    int maxExpn = (p1->expn > p2->expn) ? p1->expn : p2->expn;  // 最高指数  
  
    while (p1 != NULL && p2 != NULL) {  
        int sum = p1->expn + p2->expn;  // 当前乘积的指数  
        if (sum > maxExpn) {  
            maxExpn = sum;  
        }  
        result = createNode(p1->coef * p2->coef, sum);  // 创建新节点  
        result->next = result;  // 将新节点的next指向自身，以便插入到链表头部  
        p1 = p1->next;  
        p2 = p2->next;  
    }  
  
    // 处理剩余的项（如果有的话）  
    while (p1 != NULL) {  
        result = createNode(p1->coef, p1->expn);  // 创建新节点  
        result->next = result;  // 将新节点的next指向自身，以便插入到链表头部  
        p1 = p1->next;  
    }  
    while (p2 != NULL) {  
        result = createNode(p2->coef, p2->expn);  // 创建新节点  
        result->next = result;  // 将新节点的next指向自身，以便插入到链表头部  
        p2 = p2->next;  
    }  
  
    // 将链表断开，形成正确的顺序  
    Node *tail = result, *ptr = result->next;  
    while (ptr != result) {  
        tail->next = ptr->next;  // 断开链表  
        tail = tail->next;  
        ptr = ptr->next;  
    }  
    return result;  // 返回结果链表的头部（即最高次项）  
}  
  
/* 打印一元多项式（用于调试） */  
void printPoly(Node *poly) {  
    Node *p = poly;  
    while (p != NULL) {  
        printf("%d", p->coef);  
        if (p->expn != 1) {  // 如果指数不为1，则打印指数  
            printf("x^%d", p->expn);  
        }  
        p = p->next;  // 移动到下一个节点  
        if (p != NULL) {  // 如果还有下一个节点，则打印一个空格分隔符  
            printf(" ");  
        }  
    }  
}

